package Behaviour;

import java.awt.Point;

import javax.swing.JPanel;

import Model.Car;
import Model.CrossRoads;
import Model.Edge;

import map.Map;
import map.CellStatus.CellStatusType;
import jade.core.behaviours.OneShotBehaviour;

public class MoveCars extends OneShotBehaviour {
	private static final long serialVersionUID = 1L;
	private Map map;
	private JPanel panel;
	public MoveCars(Map map, JPanel panel) {
		this.map = map;
		this.panel = panel;
	}

	@Override
	public void action() {
		// MUOVO LE MACCHINE E SE UNA MACCHINA VUOLE ANDARE IN UNA STRADA CHE
		// RIEMPIRA'
		// SETTERA' L'USCITA A CHIUSA

		for (int i = 0; i < this.map.getCars().size(); i++) {
			Car car = this.map.getCars().get(i);
			// controllo che se la macchina ha come destinazione un incrocio
			// senza spazio libero
			// CONTROLLA CHE L'INCROCIO NON SIA CHIUSO
			if(car.checkFinish())
				continue;
			Point nextCarPosition = car.getPathToFollow().get(0);
			Point currentCarPosition = car.getPosition();
			

			// SE LA CELLA SUCCESSIVA E' OCCUPATA ALLORA FARA' RETURN

			if (map.getMap()[nextCarPosition.x][nextCarPosition.y].getStatus()
					.equals(CellStatusType.CROSS)
					&& !map.getMap()[currentCarPosition.x][currentCarPosition.y]
							.getStatus().equals(CellStatusType.CROSS)) {
				CrossRoads cross = map.getCrossRoadsFromPoint(nextCarPosition);
				boolean update = true;
				// SE L'USCITA E' CHIUSA Non MI MUOVO
				if (carEntryIsClosed(car, cross))
					update = false;
				// CONTROLLO SE CI SONO SOLO GIA' TRE MACCHINE NELL'INCROCIO
				if (cross.getNumCarInCrossRoads(map.getMap()) == 3)
					update = false;

				// IN TAL CASO LA FACCIO MUOVERE
				if (update) {
					car.updatePosition();
					// CONTROLLO SE STO PER RIEMPIRE LA STRADA ALLORA LA CHIUDO
				}

			} else {
				car.updatePosition();

			}
		}
		panel.repaint();
		for (Edge e : map.getCrossRoadsGraph().edgeSet()) {
			if( map.getCrossRoadsGraph().getEdgeWeight(e) < 0 ||  map.getCrossRoadsGraph().getEdgeWeight(e) > 3)
				System.err.println(e.getEdgePoints() + " " + map.getCrossRoadsGraph().getEdgeWeight(e));
		}

	}
	
	
	private boolean carEntryIsClosed(Car car, CrossRoads cross) {

		Point point = car.getPosition();

		if (point.equals(cross.getaDownEntry())) {
			return cross.isaDownEntryBlock();
		}
		if (point.equals(cross.getbLeftEntry())) {
			return cross.isbLeftEntryBlock();
		}
		if (point.equals(cross.getcRightEntry())) {
			return cross.iscRightEntryBlock();
		}
		if (point.equals(cross.getdUpEntry())) {
			return cross.isdUpEntryBlock();
		}

		try {
			throw new Exception("mah");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}



}
